#define  _CRT_SECURE_NO_WARNINGS
// class Solution {
// public:
//     bool hasAllCodes(string s, int k) {
//         string cur;
//         int n = s.size();
//         if(k >= n) return false;

//         for(int i = 0; i < k; i++)
//             cur += s[i];
//         unordered_set<string> hash;
//         hash.insert(cur);

//         for(int i = k; i < n; i++)
//         {
//             cur.erase(0, 1);
//             cur += s[i];
//             hash.insert(cur);
//         }

//         return hash.size() == (int)pow(2, k);
//     }
// };
class Solution {
public:
    bool hasAllCodes(string s, int k) {
        int cur = 0;
        int n = s.size();
        if (k >= n) return false;

        for (int i = 0; i < k; i++)
            cur = (cur << 1) + s[i] - '0';
        unordered_set<int> hash;
        hash.insert(cur);

        for (int i = k; i < n; i++)
        {
            cur &= ~(1 << (k - 1));
            cur = (cur << 1) + s[i] - '0';
            hash.insert(cur);
        }

        return hash.size() == (1 << k);
    }
};